package com.zc.mychart.model;

import com.github.mikephil.charting.data.CandleEntry;
import com.github.mikephil.charting.data.Entry;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2018/2/27 0027.
 */

public class EMAEntrys {
    private List<Entry> EMAs;
    private final int N = 20;

    /**
     * 【EMA】：求指数平滑移动平均
     * 用法：EMA(X,N),求X的N日指数平滑移动平均。
     * 算法：若Y=EMA(X,N)，则Y=[2*X+(N-1)*Y']/(N+1),其中Y'表示上一周期Y值。
     * 例如：EMA(CLOSE,30) 表示求30日指数平滑均价。
     * 第一天收盘价：C1=35.12;
     * 第二天收盘价：C2=31.61;
     * 第三天收盘价：C3=34.10;
     * 第四天收盘价：C4=31.12;
     * 第五天收盘价：C5=32.16;
     * EMA(C,5)
     * 第一天数值：E1=C1=35.120;
     * 第二天数值：E2=[2*C2+(N-1)*E1]/(N+1)=(2×31.61+4×35.120)÷6=33.950
     * 第三天数值：E3=[2*C3+(N-1)*E2]/(N+1)=(2×34.10+4×33.950)÷6=34.000
     * 第四天数值：E4=[2*C4+(N-1)*E3]/(N+1)=(2×31.12+4×34.000)÷6=33.040
     * 第五天数值：E5=[2*C5+(N-1)*E4]/(N+1)=(2×32.16+4×33.040)÷6=32.747
     */
    public EMAEntrys(List<CandleEntry> list) {
        EMAs = new ArrayList<>();
        float ema = 0;
        if (list != null) {
            for (int i = 0; i < list.size(); i++) {
                float close = list.get(i).getClose();
                if (i == 0) {
                    ema = close;
                } else {
                    ema = (2 * close + (N - 1) * ema) / (N + 1);
                }
                Entry entry = new Entry(list.get(i).getX(), ema);
                EMAs.add(entry);
            }
        }
    }

    public List<Entry> getEMAs() {
        return EMAs;
    }
}